219. 存在重复元素 II

219. 存在重复元素 II

Similar Question

leading to the advanced question

Solution Tips

方案一: 哈希表

第一个遇到的, 索引肯定是最小的, 之后索引会越来越大, 但是万一有多个重复的元素呢? 那样索引是需要刷新的, 那样哈希表得存一个数组了, 因为会冲突, 需要遍历数组

但是其实只需要保留最新遇到的索引就好了, 因为索引越来越大, 旧的小索引不可能再符合要求了

var containsNearbyDuplicate = function(nums, k) {
    const map = new Map();
    const length = nums.length;
    for (let i = 0; i < length; i++) {
        const num = nums[i];
        if (map.has(num) && i - map.get(num) <= k) {
            return true;
        }
        map.set(num, i);
    }
    return false;
};

方法二: 滑动窗口

直接维护一个 k 大小的窗口就行, 同时用哈希表记录窗口内的字符数量, 如果有大于 2 的就返回 true

var containsNearbyDuplicate = function(nums, k) {
    const set = new Set();
    const length = nums.length;
    for (let i = 0; i < length; i++) {
        if (i > k) {
            set.delete(nums[i - k - 1]);
        }
        if (set.has(nums[i])) {
            return true;
        }
        set.add(nums[i])
    }
    return false;
};